|
Date : 22 juin 1991 Protection : ECRANS D'ENTREE Programme : FORMATQM.COM Outils : SOFT-ICE Fichier : FORMATQM.COM Temps pass� : 1 HEURE 30. Soci�t� : SYDEX Divers : Origine : L.F. Num�ro : 101 FORMATQM est un petit utilitaire efficace et tr�s utile en SHAREWARE ce qui veut dire qu'il est de bon ton de verser sa contribution � l'auteur du soft. Et pour vous le rappelez le programme insiste lourdement � chaque d�marrage avec deux �crans de pr�sentation qui � force deviennent p�nibles. De plus ce genre d'affichage est g�n�ralement cod� pour d�courager ceux qui auraient mauvaise conscience. Et c'est le cas de FORMATQM puisqu'aucune des chaines affich�es � l'�cran n'apparait dans le fichier. Premier objectif, faire dispara�tre les 4 derni�res lignes lors de l'affichage sans param�tres. L'affichage �cran est effectu� par l'interm�diaire de l'INT 21 fonction 40. Cette fonction permet d'�crire � l'aide d'un handle, un nombre d�termin� d'octets dans un fichier ou sur un p�riph�rique. Ces caract�res sont tir�s de DS:DX et le nombre � �crire est en CX. BX contient le handle, ici il contient 0001, c'est donc sur l'�cran que les caract�res seront envoy�s. Donc il est simple de soustraire du chargement de CX le nombre de caract�res que l'on ne veut pas afficher. Le hic c'est que CX est charg� avec FFFF bien avant l'appel de l'INT 21 et que le programme fait un SCAN de la chaine pour trouver un octet �gal � 00, � ce moment CX ne contient plus que FFFF moins le nombre de caract�res � afficher soit FD70 que le programme NOTe ce qui donne 028F dans CX avant l'appel de l'INT 21. Je ne peux pas agir apr�s l'instruction SCAN. ( je n'ai pas de place ) Et on ne peut pas diminuer le contenu de CX � l'initialisation car avec le NOT on retrouve alors un r�sultat sup�rieur � afficher. 0C08:18F2 B9FFFF MOV CX,FFFF ; ON CHARGE A FFFF 0C08:18F5 FC CLD 0C08:18F6 32C0 XOR AL,AL 0C08:18F8 F2AE REPNZ SCASB ; SCAN BYTE 0C08:18FA F7D1 NOT CX 0C08:18FC 8BD3 MOV DX,BX 0C08:18FE BB0100 MOV BX,0001 ; HANDLE ECRAN DANS BX 0C08:1901 B440 MOV AH,40 ; FONCTION 40 DE L'INT 21 0C08:1903 CD21 INT 21 ; APPEL DE L'INT 21 Apr�s le NOT on trouve dans CX 028F caract�res. Il n'en faudrait que 01B0 pour ne pas afficher les 4 derni�res lignes. Je me casse la t�te un moment car je ne peux pas diminuer CX sans augmenter le r�sultat apr�s le NOT et je ne peux pas augmenter CX. ( difficile de faire rentrer plus de 65536 dans un registre 16 bits ). Mais quelle est l'utilit� de charger CX au maximum puis de faire un NOT ? aucune ! Je supprime le NOT et je charge CX avec le nombre de caract�res qu'il SCAN c'est � dire 028F plus 028F caract�res qu'il va afficher moins 00DF caract�res qu'il ne doit pas afficher. En fait: 028F + 01B0 = 043F. Et �a marche ( encore heureux ). Mais � ce point l� de mes investigations j'ignorais encore que le plus dur restait � venir, car bien �videment cette chaine est cod�e. Il faut modifier la routine ci-dessus comme suit: MOV CX,043F ; Ne charger qu'avec 34F octets CLD XOR AL,AL REPNZ SCANSB NOP ; Supprimer le NOT CX NOP Je laisse tomber pour l'instant et relance le soft avec un param�tre et celui-ci m'affiche les fameuses pages pour verser ma d�me � l'auteur. Je me mets � la recherche de la routine d'affichage et je la trouve dans un CALL que je supprime pour voir, et cel� fonctionne. Mais bien s�r il est �galement cod�. Je me mets donc � la chasse de la routine de codage qui est sans aucun doute la m�me pour mon probl�me pr�c�dent. Mon CALL � supprimer se trouve ici: 0C08:0BFA E8290D CALL... 0C08:0BFD E8E021 CALL... ; A SUPPRIMER 0C08:0C00 E8080D CALL... Je place un point d'arr�t sur cette position m�moire en �criture: BPM 0C08:0BFD W EQ E8 Et je me retrouve avec la routine suivante: 0C08:2EE1 AD LODSW ; load AX avec DS:SI 0C08:2EE2 D1C8 ROR AX,1 ; Rotate droit de 1 0C08:2EE4 35EFDE XOR AX,DEEF ; ou exclusif avec DEEF 0C08:2EE7 894402 MOV [SI+02],AX ; on re�crit au m�me endroit 0C08:2EEA E2F5 LOOP 2EE1 ; et on boucle... Ce n'est pas sorcier il faut d'abord regarder � quoi corespond la chaine avant qu'elle ne soit d�cod�e pour pouvoir la retrouver avec PCTOOLS dans le fichier. Pour cel� il suffit de mettre un point d'arr�t d'un mot en amont de la chaine � trouver. Dans le cas pr�sent il faut placer le point d'arr�t comme suit: BPM 0C08:0BC0 W EQ E8 Et on trouve en DS:SI ; 0FEE C46D 1FFE Qui donnera une fois d�cod� ; E829 0DE8 E021 Comme je veux supprimer le CALL il faut ; E829 0D90 9090 Le programme effectue les op�rations suivantes: 1- load de AX par DS:SI 2- Rotate � droite de 1 3- XOR avec DEEF 4- r�ecrit en DS:DI ATTENTION: lors d'un chargement d'un registre de la m�moire les octets bas et haut sont toujours invers�s ( standart INTEL ) ainsi que lors d'un MOV registre vers m�moire. Il faut en tenir compte puisque je vais faire les op�rations � l'envers manuellement. ( oui je sais j'ai d�j� pens� � automatiser le processus... ) Donc comme il me faut 0D90 ( premier mot ), on inverse les octets puis je reXORe avec DEEF ce qui donne : 900D XOR DEEF = 4EE2. Puis on effectue un ROL ( puisque c'�tait un ROR ) ce qui me fait 9DC4 que je retourne une fois de plus; C49D avant de l'�crire � la place de C46D. M�me punition pour le deuxi�me mot ce qui donne FE9C � mettre � la place de 1FFE pour obtenir 9090. Je fais un essai, c'est OK. Il me reste la chaine du d�but avec mon CX qui est charg� � FFFF. Je fais la aussi un BPM en amont pour avoir la chaine brute de fonderie. On a dans le fichier : AC42 2044 BA3D 3AE0 301E Une fois en clair : B9FF FFFC 32C0 F2AE F7D1 Et il me faut : B93F 04FC 32C0 F2AE 9090 La m�me op�ration est appliqu�e ce qui donne les mots suivant � placer dans le fichier : ADC2 D645 .... .... FE9C Derni�re minute, je me suis aper�u que dans le cas o� l'on lance le soft avec de mauvais param�tres il affiche n'importe quoi, ce qui me fait dire que le fait de placer 043F dans CX n'est pas la bonne solution, en fait il faut placer un caract�re null avant les quatres derni�res lignes pour que le soft ne les affiche pas et laisser la routine d'affichage intacte puisque le soft s'en sert pour afficher les messages d'erreur. Il faut scanner la chaine lorsqu'elle est d�j� en clair et voir o� il faut placer un 00 ( null ). Qu'il faudra recoder comme les autres caract�res. Avec PCTOOLS chercher 317717E1C5A9C5 et remplacer le dernier C5 par DF, puis chercher 0FEEC46D1FFE et remplacer 6D1FFE par 9DFE9C. FREDDY |